#include <iostream>
#include <stdio.h>
#define ML __int128_t
using namespace std;
typedef long long LL;
const int MAXN = 3007;
const int MAXL = MAXN*MAXN;
const LL MOD = 998244353;
LL P2[MAXL];
LL F[MAXN][MAXN];
LL Fac[MAXN];
LL MFac[MAXN][MAXN];
LL RealFac[MAXN];
LL FastPow(LL a, LL k) {
	LL ret = 1;
	while (k) {
		if (k&1) {
			ret = (ret*a) % MOD;
		}
		k=(k>>1);
		a=(a*a) % MOD;
	}
	return ret;
}
LL Recip(LL a) {
	return FastPow(a, MOD-2);
}
void Init() {
	P2[0]=1;
	for (int i=1; i<MAXL; ++i) {
		P2[i] = (2*P2[i-1]) % MOD;
	}
	Fac[0]=1;
	for (int i=1; i<MAXN; ++i) {
		Fac[i] = (Fac[i-1]*i) % MOD;
	}
	RealFac[0]=1;
	for (int i=1; i<MAXN; ++i) {
		RealFac[i] = Fac[i];
		Fac[i] = Recip(Fac[i]);
	}
	for (int i=0; i<MAXN; ++i) {
		F[i][0]=1;
        LL* K = F[i];
        LL* KK = MFac[i];
		for (int j=0; j<=i; ++j) {
			if(j&1) {
				K[j] = (K[j-1] - Fac[i-j]*Fac[j]) % MOD;
                if (K[j] < 0) K[j] += MOD;
			} else {
				K[j] = (K[j-1] + Fac[i-j]*Fac[j]) % MOD;
			}
            KK[j] = (Fac[i]*Fac[j]) % MOD * P2[i*j] % MOD;
		}
	}
    for (int i=0; i<MAXN; ++i) {
        LL* K = MFac[i];
        for (int j=i+1; j<MAXN; ++j) {
            K[j] = MFac[j][i];
        }
    }
}
LL Ans(LL n, LL m, LL a, LL b) {
	ML ret = 0;
    LL t;
	for (LL w=0; w<=n-a; ++w) {
        LL K = F[n-w][n-w-a];
        LL* KK = MFac[w];
		for (LL z=0; z<=m-b; ++z) {
			t = KK[z] * K % MOD * F[m-z][m-z-b];
			ret = (ret + t);
		}
	}
    ret = ret % MOD;
	ret = ret * RealFac[n] * RealFac[m] % MOD;
	return ret;
}
int main() {
	#ifdef hai
	freopen("in.txt", "r", stdin);
	#endif
	Init();
	int n,m,a,b;
	while (~scanf("%d%d%d%d", &n, &m, &a, &b)) {
		printf("%lld\n", Ans(n,m,a,b));
	}
	return 0;
}
